package com.dc.project.util;

import com.alibaba.fastjson2.JSON;
import com.dc.project.entity.po.TaskDetail;
import com.dc.project.service.TaskDetailItemService;
import com.dc.project.service.TaskDetailService;
import com.dc.project.service.TaskService;
import com.dc.project.util.reader.ReadUtil;
import com.own.component.common.base.AbstractAtomicQueueService;
import com.own.component.common.model.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;

/**
 * TaskResolveUtil
 *
 * @author chenxueli
 * @date 2025-03-08 16:01:00
 */
@Slf4j
@Component
public class TaskResolveUtil extends AbstractAtomicQueueService {

    /**
     * 内容提取的系统提示
     */
    private static final String SYSTEM_PROMPT = """
            # 角色
            你是一位经验丰富且极为专业的公文材料信息提取大师，凭借敏锐的洞察力和深厚扎实的专业知识底蕴，能从各类公文中精准无误地提炼出需要上交的材料信息。
            
            ## 技能
            ### 技能 1: 提取上交材料信息
            1. 当用户提供某公文内容或者明确提及某公文，并提出提取其中需要上交材料信息的需求时，运用专业且高效的方法深入细致地分析公文内容。
            2. 全面、系统且有条理地梳理出所有需上交的材料信息，以清晰、准确的方式严格按照如下特定格式列举：
            [
             { "title": "<材料名称 1>", "detail": "<具体描述该材料内容 1>" },
             { "title": "<材料名称 2>", "detail": "<具体描述该材料内容 2>" }
            ]
            3. 精准提取对每份材料内容的具体描述，务必紧密结合上下文，详尽细致地提取出来。
            
            ## 限制:
            - 仅围绕用户提供或提及公文中需上交的材料信息展开提取和回答，坚决不涉及与上交材料无关的任何话题。
            - 输出内容必须严格遵循给定格式，不允许出现任何格式偏差。
            """;

    @Resource
    private TaskService taskService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private TaskDetailItemService taskDetailItemService;

    @Resource
    private VolcengineChatUtil volcengineChatUtil;
    @Resource
    private TaskSseEmitterUtil taskSseEmitterUtil;

    /**
     * 单条信息的处理
     *
     * @return 是否需要继续执行
     */
    @Override
    protected boolean invoke() {
        // 获取第一条未处理的数据
        var detail = taskDetailService.getFirstNotHandleDetail();
        if (detail == null) {
            return false;
        }
        invokeForUrl(detail.getFkTaskId(), detail.getId(), detail.getFilePath());
        return true;
    }

    /**
     * 根据文件URL解析
     *
     * @param taskId   任务id
     * @param detailId 任务详情id
     * @param fileUrl  文件URL
     */
    private void invokeForUrl(Long taskId, Long detailId, String fileUrl) {
        var model = ReadUtil.read(fileUrl);
        var content = model.getContent();
        if (StringUtils.isBlank(content)) {
            taskDetailService.complete(detailId, TaskDetail.Status.FILE_PARSE_TEXT_FAIL);
            // 推送解析数据
            taskSseEmitterUtil.send(taskId, "REFRESH", () -> R.success(taskService.getById(taskId)));
            return;
        }
        taskDetailService.complete(detailId, content, TaskDetail.Status.FILE_PARSE_TEXT_SUCCESS);
        // 推送解析数据
        taskSseEmitterUtil.send(taskId, "REFRESH", () -> R.success(taskService.getById(taskId)));
        try {
            // 调用ai大模型分析文本内容
            var data = volcengineChatUtil.invoke(SYSTEM_PROMPT, content);
            var array = JSON.parseArray(data);
            var map = new HashMap<String, String>();
            for (var i = 0; i < array.size(); i++) {
                var item = array.getJSONObject(i);
                map.put(item.getString("title"), item.getString("detail"));
            }
            // 保存分析后的内容
            taskDetailItemService.put(taskId, detailId, map);
            taskDetailService.complete(detailId, TaskDetail.Status.FILE_CONTENT_ANALYSIS_SUCCESS);
        } catch (Exception e) {
            taskDetailService.complete(detailId, TaskDetail.Status.FILE_CONTENT_ANALYSIS_FAIL);
        } finally {
            // 推送解析数据
            taskSseEmitterUtil.send(taskId, "REFRESH", () -> R.success(taskService.getById(taskId)));
        }
    }

}
